package com.algorithm.array;

import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
import org.junit.jupiter.api.DisplayName;

@Slf4j
public class ArraySulotion06 {
    /**
     * 找出离当前值最远的大于当前
     * @param height
     * @return
     */
    public int maxArea(int[] height) {
        int max = 0;
        int i = 0;
        while (i < height.length) {
            int iv = height[i];
            int j = i + 1;
            while (j < height.length) {
                if (iv < height[j]) {
                    int i1 = iv * (j - i);
                    max = i1 > max ? i1 : max;
                } else {
                    int i1 = height[j] * (j - i);
                    max = i1 > max ? i1 : max;
                }
                j++;
            }
            i++;
        }


        return max;
    }

    @Test
    @DisplayName("给你 n 个非负整数 a1，a2，...，an，每个数代表坐标中的一个点(i,ai) 。在坐标内画 n 条垂直线，垂直线 i的两个端点分别为(i,ai)" +
            " 和 (i, 0) 。找出其中的两条线，使得它们与x轴共同构成的容器可以容纳最多的水。")
    public void test(){
        int [] height = {1,8,6,2,5,4,8,3,7};
        int i = maxArea(height);
        log.info("this is test");
    }


    public int maxArea1(int[] height) {
        int start=0;
        int end=height.length-1;
        //解题的思路是定义双指针，然后算出他们的面积，然后就是较小的那一端开始移动
        int width=0; //宽度
        int area=0;  //面积
        int max=0;
        while(start<end){
            width=end-start;
            if(height[start]>=height[end]){
                //这边是左边的地方大于右边的时候
                area=height[end]*width;
                max=changeMax(area,max);
                end--;
            }else{
                //这边是右边大于左边的时候
                area=height[start]*width;
                max=changeMax(area,max);
                start++;
            }
        }
        return max;
    }

    private int changeMax(int area, int max) {
        if(max==0){
            max=area;
        }
        if(area>max){
            max=area;
        }
        return max;
    }

    @Test
    @DisplayName("给你 n 个非负整数 a1，a2，...，an，每个数代表坐标中的一个点(i,ai) 。在坐标内画 n 条垂直线，垂直线 i的两个端点分别为(i,ai)" +
            " 和 (i, 0) 。找出其中的两条线，使得它们与x轴共同构成的容器可以容纳最多的水。")
    public void test1(){
        int [] height = {1,8,6,2,5,4,8,3,7};
        maxArea1(height);
    }
}
